﻿using System;
using System.ComponentModel;
using System.Web.UI.WebControls;
using ApplicationGenerator.CommonModule;

namespace ApplicationGenerator.Lists.Web
{
    /// <summary>
    /// Klasa bazowa dla akcji wykonywanych na listach
    /// </summary>
    [DefaultProperty("ActionName")]
    [Serializable]
    public abstract class ListActionBase : IExecuteListAction, IValidation
    {
        #region Fields
        /// <summary>
        /// Kontrolka przycisku
        /// </summary>
        [NonSerialized]
        private Button _button;

        /// <summary>
        /// Kontrolka listy
        /// </summary>
        [NonSerialized]
        private ListWebControl _listWebControl;
        #endregion

        #region Properties
        /// <summary>
        /// Kontrolka listy
        /// </summary>
        [Browsable(false)]
        public ListWebControl ListControl
        {
            get { return _listWebControl; }
            set { _listWebControl = value; }
        }

        /// <summary>
        /// Nazwa akcji
        /// </summary>
        [Category("Podstawowe dane")]
        [DisplayName("Nazwa akcji")]
        [Description("Napis, jaki będzie wyświetlany na przycisku powiązanym z tą akcją")]
        public string ActionName
        {
            get;
            set;
        }
        #endregion

        #region Methods
        /// <summary>
        /// Tworzy kontrolkę przycisku powiązaną z akcją
        /// </summary>
        /// <returns>Kontrolka przycisku związana z akcją</returns>
        public Button CreateWebControl()
        {
            _button = new Button();
            _button.Text = ActionName;
            _button.Click += new EventHandler(ActionInvoked);
            return _button;
        }

        /// <summary>
        /// Handler akcji
        /// </summary>
        /// <param name="sender">Przycisk związany z tą akcją</param>
        /// <param name="e">Argumenty akcji</param>
        void ActionInvoked(object sender, EventArgs e)
        {
            if (ListControl == null)
            {
                throw new Exception("Akcja musi mieć ustawioną kontrolkę listy");
            }

            ExecuteAction();
        }
        #endregion

        #region IExecuteListAction Members

        /// <summary>
        /// Wykonuje akcję
        /// </summary>
        public abstract void ExecuteAction();

        #endregion

        #region IValidation Members

        /// <summary>
        /// Waliduje encję
        /// </summary>
        /// <param name="errorList">Lista błędów</param>
        /// <returns>Czy encja jest poprawna ?</returns>
        public virtual bool IsValid(ErrorEntity errorList)
        {
            errorList.ControlName = this.GetType().Name;
            if (string.IsNullOrEmpty(ActionName))
            {
                errorList.ErrorStrings.Add("Należy podać wyświetlaną nazwę");
                return false;
            }

            return true;
        }

        #endregion
    }
}
